<?php

/**
 * Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 *
 * @category   Zend
 * @package    Zend_Gdata
 * @subpackage Books
 * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 * @version    $Id: VolumeEntry.php 16971 2009-07-22 18:05:45Z mikaelkael $
 */

/**
 * @see Zend_Gdata_Entry
 */
require_once 'Zend/Gdata/Entry.php';

/**
 * @see Zend_Gdata_Extension_Comments
 */
require_once 'Zend/Gdata/Extension/Comments.php';

/**
 * @see Zend_Gdata_DublinCore_Extension_Creator
 */
require_once 'Zend/Gdata/DublinCore/Extension/Creator.php';

/**
 * @see Zend_Gdata_DublinCore_Extension_Date
 */
require_once 'Zend/Gdata/DublinCore/Extension/Date.php';

/**
 * @see Zend_Gdata_DublinCore_Extension_Description
 */
require_once 'Zend/Gdata/DublinCore/Extension/Description.php';

/**
 * @see Zend_Gdata_Books_Extension_Embeddability
 */
require_once 'Zend/Gdata/Books/Extension/Embeddability.php';

/**
 * @see Zend_Gdata_DublinCore_Extension_Format
 */
require_once 'Zend/Gdata/DublinCore/Extension/Format.php';

/**
 * @see Zend_Gdata_DublinCore_Extension_Identifier
 */
require_once 'Zend/Gdata/DublinCore/Extension/Identifier.php';

/**
 * @see Zend_Gdata_DublinCore_Extension_Language
 */
require_once 'Zend/Gdata/DublinCore/Extension/Language.php';

/**
 * @see Zend_Gdata_DublinCore_Extension_Publisher
 */
require_once 'Zend/Gdata/DublinCore/Extension/Publisher.php';

/**
 * @see Zend_Gdata_Extension_Rating
 */
require_once 'Zend/Gdata/Extension/Rating.php';

/**
 * @see Zend_Gdata_Books_Extension_Review
 */
require_once 'Zend/Gdata/Books/Extension/Review.php';

/**
 * @see Zend_Gdata_DublinCore_Extension_Subject
 */
require_once 'Zend/Gdata/DublinCore/Extension/Subject.php';

/**
 * @see Zend_Gdata_DublinCore_Extension_Title
 */
require_once 'Zend/Gdata/DublinCore/Extension/Title.php';

/**
 * @see Zend_Gdata_Books_Extension_Viewability
 */
require_once 'Zend/Gdata/Books/Extension/Viewability.php';

/**
 * Describes an entry in a feed of Book Search volumes
 *
 * @category   Zend
 * @package    Zend_Gdata
 * @subpackage Books
 * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 */
class Zend_Gdata_Books_VolumeEntry extends Zend_Gdata_Entry
{

	const THUMBNAIL_LINK_REL = 'http://schemas.google.com/books/2008/thumbnail';
	const PREVIEW_LINK_REL = 'http://schemas.google.com/books/2008/preview';
	const INFO_LINK_REL = 'http://schemas.google.com/books/2008/info';
	const ANNOTATION_LINK_REL = 'http://schemas.google.com/books/2008/annotation';

	protected $_comments = null;
	protected $_creators = array();
	protected $_dates = array();
	protected $_descriptions = array();
	protected $_embeddability = null;
	protected $_formats = array();
	protected $_identifiers = array();
	protected $_languages = array();
	protected $_publishers = array();
	protected $_rating = null;
	protected $_review = null;
	protected $_subjects = array();
	protected $_titles = array();
	protected $_viewability = null;

	/**
	 * Constructor for Zend_Gdata_Books_VolumeEntry which
	 * Describes an entry in a feed of Book Search volumes
	 *
	 * @param DOMElement $element (optional) DOMElement from which this
	 *          object should be constructed.
	 */
	public function __construct($element = null)
	{
		$this->registerAllNamespaces(Zend_Gdata_Books::$namespaces);
		parent::__construct($element);
	}

	/**
	 * Retrieves DOMElement which corresponds to this element and all
	 * child properties. This is used to build this object back into a DOM
	 * and eventually XML text for sending to the server upon updates, or
	 * for application storage/persistance.
	 *
	 * @param DOMDocument $doc The DOMDocument used to construct DOMElements
	 * @return DOMElement The DOMElement representing this element and all
	 * child properties.
	 */
	public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null)
	{
		$element = parent::getDOM($doc);
		if ($this->_creators !== null) {
			foreach ($this->_creators as $creators) {
				$element->appendChild($creators->getDOM(
				$element->ownerDocument));
			}
		}
		if ($this->_dates !== null) {
			foreach ($this->_dates as $dates) {
				$element->appendChild($dates->getDOM($element->ownerDocument));
			}
		}
		if ($this->_descriptions !== null) {
			foreach ($this->_descriptions as $descriptions) {
				$element->appendChild($descriptions->getDOM(
				$element->ownerDocument));
			}
		}
		if ($this->_formats !== null) {
			foreach ($this->_formats as $formats) {
				$element->appendChild($formats->getDOM(
				$element->ownerDocument));
			}
		}
		if ($this->_identifiers !== null) {
			foreach ($this->_identifiers as $identifiers) {
				$element->appendChild($identifiers->getDOM(
				$element->ownerDocument));
			}
		}
		if ($this->_languages !== null) {
			foreach ($this->_languages as $languages) {
				$element->appendChild($languages->getDOM(
				$element->ownerDocument));
			}
		}
		if ($this->_publishers !== null) {
			foreach ($this->_publishers as $publishers) {
				$element->appendChild($publishers->getDOM(
				$element->ownerDocument));
			}
		}
		if ($this->_subjects !== null) {
			foreach ($this->_subjects as $subjects) {
				$element->appendChild($subjects->getDOM(
				$element->ownerDocument));
			}
		}
		if ($this->_titles !== null) {
			foreach ($this->_titles as $titles) {
				$element->appendChild($titles->getDOM($element->ownerDocument));
			}
		}
		if ($this->_comments !== null) {
			$element->appendChild($this->_comments->getDOM(
			$element->ownerDocument));
		}
		if ($this->_embeddability !== null) {
			$element->appendChild($this->_embeddability->getDOM(
			$element->ownerDocument));
		}
		if ($this->_rating !== null) {
			$element->appendChild($this->_rating->getDOM(
			$element->ownerDocument));
		}
		if ($this->_review !== null) {
			$element->appendChild($this->_review->getDOM(
			$element->ownerDocument));
		}
		if ($this->_viewability !== null) {
			$element->appendChild($this->_viewability->getDOM(
			$element->ownerDocument));
		}
		return $element;
	}

	/**
	 * Creates individual objects of the appropriate type and stores
	 * them in this object based upon DOM data.
	 *
	 * @param DOMNode $child The DOMNode to process.
	 */
	protected function takeChildFromDOM($child)
	{
		$absoluteNodeName = $child->namespaceURI . ':' . $child->localName;
		switch ($absoluteNodeName) {
			case $this->lookupNamespace('dc') . ':' . 'creator':
				$creators = new Zend_Gdata_DublinCore_Extension_Creator();
				$creators->transferFromDOM($child);
				$this->_creators[] = $creators;
				break;
			case $this->lookupNamespace('dc') . ':' . 'date':
				$dates = new Zend_Gdata_DublinCore_Extension_Date();
				$dates->transferFromDOM($child);
				$this->_dates[] = $dates;
				break;
			case $this->lookupNamespace('dc') . ':' . 'description':
				$descriptions = new Zend_Gdata_DublinCore_Extension_Description();
				$descriptions->transferFromDOM($child);
				$this->_descriptions[] = $descriptions;
				break;
			case $this->lookupNamespace('dc') . ':' . 'format':
				$formats = new Zend_Gdata_DublinCore_Extension_Format();
				$formats->transferFromDOM($child);
				$this->_formats[] = $formats;
				break;
			case $this->lookupNamespace('dc') . ':' . 'identifier':
				$identifiers = new Zend_Gdata_DublinCore_Extension_Identifier();
				$identifiers->transferFromDOM($child);
				$this->_identifiers[] = $identifiers;
				break;
			case $this->lookupNamespace('dc') . ':' . 'language':
				$languages = new Zend_Gdata_DublinCore_Extension_Language();
				$languages->transferFromDOM($child);
				$this->_languages[] = $languages;
				break;
			case $this->lookupNamespace('dc') . ':' . 'publisher':
				$publishers = new Zend_Gdata_DublinCore_Extension_Publisher();
				$publishers->transferFromDOM($child);
				$this->_publishers[] = $publishers;
				break;
			case $this->lookupNamespace('dc') . ':' . 'subject':
				$subjects = new Zend_Gdata_DublinCore_Extension_Subject();
				$subjects->transferFromDOM($child);
				$this->_subjects[] = $subjects;
				break;
			case $this->lookupNamespace('dc') . ':' . 'title':
				$titles = new Zend_Gdata_DublinCore_Extension_Title();
				$titles->transferFromDOM($child);
				$this->_titles[] = $titles;
				break;
			case $this->lookupNamespace('gd') . ':' . 'comments':
				$comments = new Zend_Gdata_Extension_Comments();
				$comments->transferFromDOM($child);
				$this->_comments = $comments;
				break;
			case $this->lookupNamespace('gbs') . ':' . 'embeddability':
				$embeddability = new Zend_Gdata_Books_Extension_Embeddability();
				$embeddability->transferFromDOM($child);
				$this->_embeddability = $embeddability;
				break;
			case $this->lookupNamespace('gd') . ':' . 'rating':
				$rating = new Zend_Gdata_Extension_Rating();
				$rating->transferFromDOM($child);
				$this->_rating = $rating;
				break;
			case $this->lookupNamespace('gbs') . ':' . 'review':
				$review = new Zend_Gdata_Books_Extension_Review();
				$review->transferFromDOM($child);
				$this->_review = $review;
				break;
			case $this->lookupNamespace('gbs') . ':' . 'viewability':
				$viewability = new Zend_Gdata_Books_Extension_Viewability();
				$viewability->transferFromDOM($child);
				$this->_viewability = $viewability;
				break;
			default:
				parent::takeChildFromDOM($child);
				break;
		}
	}

	/**
	 * Returns the Comments class
	 *
	 * @return Zend_Gdata_Extension_Comments|null The comments
	 */
	public function getComments()
	{
		return $this->_comments;
	}

	/**
	 * Returns the creators
	 *
	 * @return array The creators
	 */
	public function getCreators()
	{
		return $this->_creators;
	}

	/**
	 * Returns the dates
	 *
	 * @return array The dates
	 */
	public function getDates()
	{
		return $this->_dates;
	}

	/**
	 * Returns the descriptions
	 *
	 * @return array The descriptions
	 */
	public function getDescriptions()
	{
		return $this->_descriptions;
	}

	/**
	 * Returns the embeddability
	 *
	 * @return Zend_Gdata_Books_Extension_Embeddability|null The embeddability
	 */
	public function getEmbeddability()
	{
		return $this->_embeddability;
	}

	/**
	 * Returns the formats
	 *
	 * @return array The formats
	 */
	public function getFormats()
	{
		return $this->_formats;
	}

	/**
	 * Returns the identifiers
	 *
	 * @return array The identifiers
	 */
	public function getIdentifiers()
	{
		return $this->_identifiers;
	}

	/**
	 * Returns the languages
	 *
	 * @return array The languages
	 */
	public function getLanguages()
	{
		return $this->_languages;
	}

	/**
	 * Returns the publishers
	 *
	 * @return array The publishers
	 */
	public function getPublishers()
	{
		return $this->_publishers;
	}

	/**
	 * Returns the rating
	 *
	 * @return Zend_Gdata_Extension_Rating|null The rating
	 */
	public function getRating()
	{
		return $this->_rating;
	}

	/**
	 * Returns the review
	 *
	 * @return Zend_Gdata_Books_Extension_Review|null The review
	 */
	public function getReview()
	{
		return $this->_review;
	}

	/**
	 * Returns the subjects
	 *
	 * @return array The subjects
	 */
	public function getSubjects()
	{
		return $this->_subjects;
	}

	/**
	 * Returns the titles
	 *
	 * @return array The titles
	 */
	public function getTitles()
	{
		return $this->_titles;
	}

	/**
	 * Returns the viewability
	 *
	 * @return Zend_Gdata_Books_Extension_Viewability|null The viewability
	 */
	public function getViewability()
	{
		return $this->_viewability;
	}

	/**
	 * Sets the Comments class
	 *
	 * @param Zend_Gdata_Extension_Comments|null $comments Comments class
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setComments($comments)
	{
		$this->_comments = $comments;
		return $this;
	}

	/**
	 * Sets the creators
	 *
	 * @param array $creators Creators|null
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setCreators($creators)
	{
		$this->_creators = $creators;
		return $this;
	}

	/**
	 * Sets the dates
	 *
	 * @param array $dates dates
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setDates($dates)
	{
		$this->_dates = $dates;
		return $this;
	}

	/**
	 * Sets the descriptions
	 *
	 * @param array $descriptions descriptions
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setDescriptions($descriptions)
	{
		$this->_descriptions = $descriptions;
		return $this;
	}

	/**
	 * Sets the embeddability
	 *
	 * @param Zend_Gdata_Books_Extension_Embeddability|null $embeddability
	 *        embeddability
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setEmbeddability($embeddability)
	{
		$this->_embeddability = $embeddability;
		return $this;
	}

	/**
	 * Sets the formats
	 *
	 * @param array $formats formats
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setFormats($formats)
	{
		$this->_formats = $formats;
		return $this;
	}

	/**
	 * Sets the identifiers
	 *
	 * @param array $identifiers identifiers
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setIdentifiers($identifiers)
	{
		$this->_identifiers = $identifiers;
		return $this;
	}

	/**
	 * Sets the languages
	 *
	 * @param array $languages languages
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setLanguages($languages)
	{
		$this->_languages = $languages;
		return $this;
	}

	/**
	 * Sets the publishers
	 *
	 * @param array $publishers publishers
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setPublishers($publishers)
	{
		$this->_publishers = $publishers;
		return $this;
	}

	/**
	 * Sets the rating
	 *
	 * @param Zend_Gdata_Extension_Rating|null $rating rating
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setRating($rating)
	{
		$this->_rating = $rating;
		return $this;
	}

	/**
	 * Sets the review
	 *
	 * @param Zend_Gdata_Books_Extension_Review|null $review review
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setReview($review)
	{
		$this->_review = $review;
		return $this;
	}

	/**
	 * Sets the subjects
	 *
	 * @param array $subjects subjects
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setSubjects($subjects)
	{
		$this->_subjects = $subjects;
		return $this;
	}

	/**
	 * Sets the titles
	 *
	 * @param array $titles titles
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setTitles($titles)
	{
		$this->_titles = $titles;
		return $this;
	}

	/**
	 * Sets the viewability
	 *
	 * @param Zend_Gdata_Books_Extension_Viewability|null $viewability
	 *        viewability
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setViewability($viewability)
	{
		$this->_viewability = $viewability;
		return $this;
	}


	/**
	 * Gets the volume ID based upon the atom:id value
	 *
	 * @return string The volume ID
	 * @throws Zend_Gdata_App_Exception
	 */
	public function getVolumeId()
	{
		$fullId = $this->getId()->getText();
		$position = strrpos($fullId, '/');
		if ($position === false) {
			require_once 'Zend/Gdata/App/Exception.php';
			throw new Zend_Gdata_App_Exception('Slash not found in atom:id');
		} else {
			return substr($fullId, strrpos($fullId,'/') + 1);
		}
	}

	/**
	 * Gets the thumbnail link
	 *
	 * @return Zend_Gdata_App_Extension_link|null The thumbnail link
	 */
	public function getThumbnailLink()
	{
		return $this->getLink(self::THUMBNAIL_LINK_REL);
	}

	/**
	 * Gets the preview link
	 *
	 * @return Zend_Gdata_App_Extension_Link|null The preview link
	 */
	public function getPreviewLink()
	{
		return $this->getLink(self::PREVIEW_LINK_REL);
	}

	/**
	 * Gets the info link
	 *
	 * @return Zend_Gdata_App_Extension_Link|null The info link
	 */
	public function getInfoLink()
	{
		return $this->getLink(self::INFO_LINK_REL);
	}

	/**
	 * Gets the annotations link
	 *
	 * @return Zend_Gdata_App_Extension_Link|null The annotations link
	 */
	public function getAnnotationLink()
	{
		return $this->getLink(self::ANNOTATION_LINK_REL);
	}

}
